package main.java.study.utils;

import java.text.SimpleDateFormat;
import java.util.Date;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

@SuppressWarnings("restriction")
public class EncrypAES {
    // 密匙
    private static final String KEY = "f4k9f5w7f8g4er26";
    // 偏移量
    private static final String OFFSET = "5e8y6w45ju8w9jq8";
    // 编码
    private static final String ENCODING = "UTF-8";
    // 算法
    private static final String ALGORITHM = "AES";
    // 默认的加密算法
    private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";
    // 负责保存加密的结果
    private static byte[] encrypted;

    /**
    * @Title: encrypt
    * @Description: 加密
    * @param data 待加密数据
    * @return 返回已加密数据
    * @throws Exception String
    * @author cwk 2019年8月2日
    */
    public static String encrypt(String data) throws Exception {
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); // 负责加解密任务
        SecretKeySpec skeySpec = new SecretKeySpec(KEY.getBytes("ASCII"), ALGORITHM);
        IvParameterSpec iv = new IvParameterSpec(OFFSET.getBytes());// 使用CBC模式，需要一个向量iv，可增加加密算法的强度
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
        byte[] encrypted = cipher.doFinal(data.getBytes(ENCODING));
        return new BASE64Encoder().encode(encrypted);// 此处使用BASE64做转码。
    }

    /**
     * @Title: decrypt
     * @Description: 解密
     * @param data 待解密数据
     * @return 返回解密结果
     * @throws Exception String
     * @author cwk 2019年8月2日
     */
    public static String decrypt(String data) throws Exception {
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); // 负责加解密任务
        SecretKeySpec skeySpec = new SecretKeySpec(KEY.getBytes("ASCII"), ALGORITHM);
        IvParameterSpec iv = new IvParameterSpec(OFFSET.getBytes());// 使用CBC模式，需要一个向量iv，可增加加密算法的强度
        cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
        byte[] buffer = new BASE64Decoder().decodeBuffer(data);
        encrypted = cipher.doFinal(buffer);
        return new String(encrypted, ENCODING);// 此处使用BASE64做转码。
    }

    /**
     * 测试
     */
    public static void main(String[] args) throws Exception {
        String msg ="1";
        //获取当前时间为开始时间，转换为long型
        String startTime =new SimpleDateFormat("yyyy-MM-dd hh:mm:ss:SSS").format(new Date());
        String encontent = encrypt(msg);
        //获取当前时间为截止时间，转换为long型
        String stopTime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss:SSS").format(new Date());
        String decontent = decrypt(encontent);
        System.out.println("明文是:" + msg);
        System.out.println("加密后:" + encontent);
        System.out.println("解密后:" + decontent);
        System.out.println("开始时间:" + startTime);
        System.out.println("结束时间:" + stopTime);
    }

}
